;2008-05-20
;Av Benjamin Ingberg och Patrik Johansson
;
;Grundklassen för alla spelare och monster, ärver från world-object.
;Hanterar kollisonshanteringen 

(load "world-object.scm")

(define character%
  (class world-object%
    (init x y w h sprites)
    (super-new [x x][y y][w w][h h][sprites sprites])

    (define/public (update board)
      (void))
    
    ;denna godtyckligt döpta funktion ska reagera på vilken sorts world-object den har kolliderat med.
    ;gjord för att överlagras om man vill ha någon form av special kontroll över hur man får gå
    ;den ska returnera sant/falskt om man får gå på objektet, samt interagera med objektet på det sätt den önskar
    (define/public (object-interaction obj board)
      (eq? (send obj get-type) 'normal))
    
    (define/public (try-move newX newY board)
      (send this set-direction (cond ((< (send this get-x) newX) 'right)
                                     ((> (send this get-x) newX) 'left)
                                     ((< (send this get-y) newY) 'down)
                                     ((> (send this get-y) newY) 'up)
                                     (else 'default)))
      (let ((x newX)
            (y newY)
            (w (send this get-w))
            (h (send this get-h)))
        (if (send board is-inside-board? x y (+ x w) (+ y h))
            (let ((allowed-move #t))
              (for-each
               (lambda (obj) 
                 (if (and (send obj collides? x y w h)
                          (not (eq? obj this)))
                     (set! allowed-move (object-interaction obj board))))
               (send board get-world-objects))
              (if allowed-move
                  (begin (send this set-x! x)
                         (send this set-y! y)))))))))
